#include "OffLineRenderPCH.h"
#include "OR_SamplerPermutedHalton.h"
#include "UT_SampleHelper.h"
#include "UT_MathHelper.h"

using namespace OffLineRender;
using namespace Utility;


// Sampling Local Definitions
static const int primes[] = {
	// First 1000 prime numbers
	2,      3,      5,      7,     11,     13,     17,     19,     23,     29,
	31,     37,     41,     43,     47,     53,     59,     61,     67,     71,
	73,     79,     83,     89,     97,    101,    103,    107,    109,    113,
	127,    131,    137,    139,    149,    151,    157,    163,    167,    173,
	179,    181,    191,    193,    197,    199,    211,    223,    227,    229,
	233,    239,    241,    251,    257,    263,    269,    271,    277,    281,
	283,    293,    307,    311,    313,    317,    331,    337,    347,    349,
	353,    359,    367,    373,    379,    383,    389,    397,    401,    409,
	419,    421,    431,    433,    439,    443,    449,    457,    461,    463,
	467,    479,    487,    491,    499,    503,    509,    521,    523,    541,
	547,    557,    563,    569,    571,    577,    587,    593,    599,    601,
	607,    613,    617,    619,    631,    641,    643,    647,    653,    659,
	661,    673,    677,    683,    691,    701,    709,    719,    727,    733,
	739,    743,    751,    757,    761,    769,    773,    787,    797,    809,
	811,    821,    823,    827,    829,    839,    853,    857,    859,    863,
	877,    881,    883,    887,    907,    911,    919,    929,    937,    941,
	947,    953,    967,    971,    977,    983,    991,    997,   1009,   1013,
	1019,   1021,   1031,   1033,   1039,   1049,   1051,   1061,   1063,   1069,
	1087,   1091,   1093,   1097,   1103,   1109,   1117,   1123,   1129,   1151,
	1153,   1163,   1171,   1181,   1187,   1193,   1201,   1213,   1217,   1223,
	1229,   1231,   1237,   1249,   1259,   1277,   1279,   1283,   1289,   1291,
	1297,   1301,   1303,   1307,   1319,   1321,   1327,   1361,   1367,   1373,
	1381,   1399,   1409,   1423,   1427,   1429,   1433,   1439,   1447,   1451,
	1453,   1459,   1471,   1481,   1483,   1487,   1489,   1493,   1499,   1511,
	1523,   1531,   1543,   1549,   1553,   1559,   1567,   1571,   1579,   1583,
	1597,   1601,   1607,   1609,   1613,   1619,   1621,   1627,   1637,   1657,
	1663,   1667,   1669,   1693,   1697,   1699,   1709,   1721,   1723,   1733,
	1741,   1747,   1753,   1759,   1777,   1783,   1787,   1789,   1801,   1811,
	1823,   1831,   1847,   1861,   1867,   1871,   1873,   1877,   1879,   1889,
	1901,   1907,   1913,   1931,   1933,   1949,   1951,   1973,   1979,   1987,
	1993,   1997,   1999,   2003,   2011,   2017,   2027,   2029,   2039,   2053,
	2063,   2069,   2081,   2083,   2087,   2089,   2099,   2111,   2113,   2129,
	2131,   2137,   2141,   2143,   2153,   2161,   2179,   2203,   2207,   2213,
	2221,   2237,   2239,   2243,   2251,   2267,   2269,   2273,   2281,   2287,
	2293,   2297,   2309,   2311,   2333,   2339,   2341,   2347,   2351,   2357,
	2371,   2377,   2381,   2383,   2389,   2393,   2399,   2411,   2417,   2423,
	2437,   2441,   2447,   2459,   2467,   2473,   2477,   2503,   2521,   2531,
	2539,   2543,   2549,   2551,   2557,   2579,   2591,   2593,   2609,   2617,
	2621,   2633,   2647,   2657,   2659,   2663,   2671,   2677,   2683,   2687,
	2689,   2693,   2699,   2707,   2711,   2713,   2719,   2729,   2731,   2741,
	2749,   2753,   2767,   2777,   2789,   2791,   2797,   2801,   2803,   2819,
	2833,   2837,   2843,   2851,   2857,   2861,   2879,   2887,   2897,   2903,
	2909,   2917,   2927,   2939,   2953,   2957,   2963,   2969,   2971,   2999,
	3001,   3011,   3019,   3023,   3037,   3041,   3049,   3061,   3067,   3079,
	3083,   3089,   3109,   3119,   3121,   3137,   3163,   3167,   3169,   3181,
	3187,   3191,   3203,   3209,   3217,   3221,   3229,   3251,   3253,   3257,
	3259,   3271,   3299,   3301,   3307,   3313,   3319,   3323,   3329,   3331,
	3343,   3347,   3359,   3361,   3371,   3373,   3389,   3391,   3407,   3413,
	3433,   3449,   3457,   3461,   3463,   3467,   3469,   3491,   3499,   3511,
	3517,   3527,   3529,   3533,   3539,   3541,   3547,   3557,   3559,   3571,
	3581,   3583,   3593,   3607,   3613,   3617,   3623,   3631,   3637,   3643,
	3659,   3671,   3673,   3677,   3691,   3697,   3701,   3709,   3719,   3727,
	3733,   3739,   3761,   3767,   3769,   3779,   3793,   3797,   3803,   3821,
	3823,   3833,   3847,   3851,   3853,   3863,   3877,   3881,   3889,   3907,
	3911,   3917,   3919,   3923,   3929,   3931,   3943,   3947,   3967,   3989,
	4001,   4003,   4007,   4013,   4019,   4021,   4027,   4049,   4051,   4057,
	4073,   4079,   4091,   4093,   4099,   4111,   4127,   4129,   4133,   4139,
	4153,   4157,   4159,   4177,   4201,   4211,   4217,   4219,   4229,   4231,
	4241,   4243,   4253,   4259,   4261,   4271,   4273,   4283,   4289,   4297,
	4327,   4337,   4339,   4349,   4357,   4363,   4373,   4391,   4397,   4409,
	4421,   4423,   4441,   4447,   4451,   4457,   4463,   4481,   4483,   4493,
	4507,   4513,   4517,   4519,   4523,   4547,   4549,   4561,   4567,   4583,
	4591,   4597,   4603,   4621,   4637,   4639,   4643,   4649,   4651,   4657,
	4663,   4673,   4679,   4691,   4703,   4721,   4723,   4729,   4733,   4751,
	4759,   4783,   4787,   4789,   4793,   4799,   4801,   4813,   4817,   4831,
	4861,   4871,   4877,   4889,   4903,   4909,   4919,   4931,   4933,   4937,
	4943,   4951,   4957,   4967,   4969,   4973,   4987,   4993,   4999,   5003,
	5009,   5011,   5021,   5023,   5039,   5051,   5059,   5077,   5081,   5087,
	5099,   5101,   5107,   5113,   5119,   5147,   5153,   5167,   5171,   5179,
	5189,   5197,   5209,   5227,   5231,   5233,   5237,   5261,   5273,   5279,
	5281,   5297,   5303,   5309,   5323,   5333,   5347,   5351,   5381,   5387,
	5393,   5399,   5407,   5413,   5417,   5419,   5431,   5437,   5441,   5443,
	5449,   5471,   5477,   5479,   5483,   5501,   5503,   5507,   5519,   5521,
	5527,   5531,   5557,   5563,   5569,   5573,   5581,   5591,   5623,   5639,
	5641,   5647,   5651,   5653,   5657,   5659,   5669,   5683,   5689,   5693,
	5701,   5711,   5717,   5737,   5741,   5743,   5749,   5779,   5783,   5791,
	5801,   5807,   5813,   5821,   5827,   5839,   5843,   5849,   5851,   5857,
	5861,   5867,   5869,   5879,   5881,   5897,   5903,   5923,   5927,   5939,
	5953,   5981,   5987,   6007,   6011,   6029,   6037,   6043,   6047,   6053,
	6067,   6073,   6079,   6089,   6091,   6101,   6113,   6121,   6131,   6133,
	6143,   6151,   6163,   6173,   6197,   6199,   6203,   6211,   6217,   6221,
	6229,   6247,   6257,   6263,   6269,   6271,   6277,   6287,   6299,   6301,
	6311,   6317,   6323,   6329,   6337,   6343,   6353,   6359,   6361,   6367,
	6373,   6379,   6389,   6397,   6421,   6427,   6449,   6451,   6469,   6473,
	6481,   6491,   6521,   6529,   6547,   6551,   6553,   6563,   6569,   6571,
	6577,   6581,   6599,   6607,   6619,   6637,   6653,   6659,   6661,   6673,
	6679,   6689,   6691,   6701,   6703,   6709,   6719,   6733,   6737,   6761,
	6763,   6779,   6781,   6791,   6793,   6803,   6823,   6827,   6829,   6833,
	6841,   6857,   6863,   6869,   6871,   6883,   6899,   6907,   6911,   6917,
	6947,   6949,   6959,   6961,   6967,   6971,   6977,   6983,   6991,   6997,
	7001,   7013,   7019,   7027,   7039,   7043,   7057,   7069,   7079,   7103,
	7109,   7121,   7127,   7129,   7151,   7159,   7177,   7187,   7193,   7207,
	7211,   7213,   7219,   7229,   7237,   7243,   7247,   7253,   7283,   7297,
	7307,   7309,   7321,   7331,   7333,   7349,   7351,   7369,   7393,   7411,
	7417,   7433,   7451,   7457,   7459,   7477,   7481,   7487,   7489,   7499,
	7507,   7517,   7523,   7529,   7537,   7541,   7547,   7549,   7559,   7561,
	7573,   7577,   7583,   7589,   7591,   7603,   7607,   7621,   7639,   7643,
	7649,   7669,   7673,   7681,   7687,   7691,   7699,   7703,   7717,   7723,
	7727,   7741,   7753,   7757,   7759,   7789,   7793,   7817,   7823,   7829,
	7841,   7853,   7867,   7873,   7877,   7879,   7883,   7901,   7907,   7919
};
//------------------------------------------------------------
OR_SamplerPermutedHalton::OR_SamplerPermutedHalton(uint32_t uiDimension, Utility::UT_RandomNumGenerator &rng)
{
	m_uiDimension = uiDimension;

	// Determine bases $b_i$ and their sum
	m_puiBases = (uint32_t*)MM_STAND_ALLOC(m_uiDimension * sizeof(uint32_t));
	uint32_t sumBases = 0;
	for (uint32_t i = 0; i < m_uiDimension; ++i)
	{
		m_puiBases[i] = primes[i];
		sumBases += m_puiBases[i];
	}

	// Compute permutation tables for each base
	m_puiPermuteTables = (uint32_t*)MM_STAND_ALLOC(sumBases * sizeof(uint32_t));
	uint32_t *p = m_puiPermuteTables;
	for (uint32_t i = 0; i < m_uiDimension; ++i) 
	{
		UT_SampleHelper::GeneratePermutation(p, m_puiBases[i], rng);
		p += m_puiBases[i];
	}
}
//------------------------------------------------------------
OR_SamplerPermutedHalton::~OR_SamplerPermutedHalton()
{
	MM_STAND_DEALLOC(m_puiBases);
	MM_STAND_DEALLOC(m_puiPermuteTables);
}
//------------------------------------------------------------
void OR_SamplerPermutedHalton::Sample(uint32_t n, float *out) const
{
	uint32_t *p = m_puiPermuteTables;
	
	for (uint32_t i = 0; i < m_uiDimension; ++i)
	{
		out[i] = UT_MathHelper::Min(float(UT_SampleHelper::PermutedRadicalInverse(n, m_puiBases[i], p)),
			UT_MathDefine::_ONE_MINUS_EPSILON);
	
		p += m_puiBases[i];
	}

}
//------------------------------------------------------------
//------------------------------------------------------------